package com.DB;

import java.sql.*;

import Fenetre.FenetrePrincipale;
import Fenetre.ProgressPanel;

/**
 * DBConnector permet de se connecter à une base de données sous MYSQL
 * @author florent
 */
public class DBConnector {

	public static String protocol = "mysql";      //nom du sgbd
	public static String adresse = "localhost";   //addresse du sgbd
	public static String nom_base = "db_logique"; //nom de la base de données

	public static String utilisateur = "root";   //login de la base de données
	public static String password = "root";      //password associé au login

	//private Connection connection = null; //connecteur jdbc

	/**
	 * 
	 * @param protocol nom du sgbd
	 * @param adresse addresse du sgbd
	 * @param nom_base nom de la base de données
	 * @param utilisateur login de la base de données
	 * @param password password associé au login
	 * 
	 * Constructeur de DBConnector avec tout les attributs
	 */
	public DBConnector(String protocol,String adresse,String nom_base,String utilisateur,String password){
		DBConnector.protocol = protocol;
		DBConnector.adresse = adresse;
		DBConnector.nom_base = nom_base;
		DBConnector.utilisateur = utilisateur;
		DBConnector.password = password;
	}
	
	public DBConnector(String nom_base){
		DBConnector.nom_base = nom_base;
	}

	/**
	 * Constructeur de DBConnector avec sgbd mysql local
	 * @param nom_base nom de la base de données
	 * @param utilisateur login de la base de données
	 * @param password password associé au login
	 */
	public DBConnector(String nom_base,String utilisateur,String password){
		DBConnector.nom_base = nom_base;
		DBConnector.utilisateur = utilisateur;
		DBConnector.password = password;
	}

	/**
	 * Créé une Base de données.
	 * Si elle existe deja, elle est supprimée puis recréée
	 * @param nom Nom de la base de données à créé
	 */
	public void creer(String nom){
		Connection c = newConnection();
		executeUpdate("DROP DATABASE IF EXISTS "+nom+";",c);        //supprime l'ancienne bd
		executeUpdate("CREATE DATABASE IF NOT EXISTS "+nom+";",c);  //créé la nouvelle
		close(c);
	}
	
	public void creer(String nom,FenetrePrincipale fenetre){
		
		if(fenetre != null)
			fenetre.setProgressValue(ProgressPanel.CREATION_BASE,0);
		else
			System.out.print("Creation de la base de donnees "+nom+" :");
		
		Connection c = newConnection();
		executeUpdate("DROP DATABASE IF EXISTS "+nom+";",c);        //supprime l'ancienne bd
		executeUpdate("CREATE DATABASE IF NOT EXISTS "+nom+";",c);  //créé la nouvelle
		close(c);
		if(fenetre != null)
			fenetre.setProgressValue(ProgressPanel.CREATION_BASE,100);
		else
			System.out.println(" ok");
	}


	/**
	 * Connecte le driver mysql à jdbc
	 * @throws ClassNotFoundException
	 */
	void loadDriver() throws ClassNotFoundException {
		Class.forName("com.mysql.jdbc.Driver");
	}

	/**
	 * Obtient une connection à la base de données
	 * @return une connection à la base de données
	 */
	public Connection newConnection(){
		Connection c = null;
		try{
			final String url = "jdbc:"+protocol+"://"+adresse+"/"+nom_base;
			c = DriverManager.getConnection(url, utilisateur, password);
		}catch(SQLException e){
			e.printStackTrace();
		}
		return c;
	}

	/**
	 * Ferme la connection à la base de données
	 */
	public void close(Connection c){
		if(c != null){
			try {
				c.close();
				c = null;
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * Exécute une requete sur la base de données
	 * @param query la requete en format Texte
	 * @return le resultat de la requette
	 */
	public ResultSet executeQuery(String query, Connection c){
		ResultSet rs = null;
		try {
			Statement st = c.createStatement();
			rs = st.executeQuery(query);

		} catch (SQLException e) {
			System.err.println(query);
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * Execute une requete de création/suppression/insertion... sur la base de données
	 * @param query la requete en format Texte
	 */
	public void executeUpdate(String query,Connection c){
		try {
			Statement st = c.createStatement();
			st.executeUpdate(query);
		} catch (SQLException e) {
			System.out.println(query);
			e.printStackTrace();
		}
	}

}
